/*
 * Copyright (C) 2013 AdminsProL2
 * 
 * This program is free software: you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later
 * version.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU General Public License along with
 * this program. If not, see <http://www.gnu.org/licenses/>.
 */

package com.l2jserver.gameserver.instancemanager.votereward;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import com.l2jserver.Config;
import com.l2jserver.L2DatabaseFactory;
import com.l2jserver.gameserver.Announcements;
import com.l2jserver.gameserver.ThreadPoolManager;
import com.l2jserver.gameserver.model.L2World;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;

/**
 * @author fissban
 */

public class VoteRewardAdminsPro
{
	static Logger _log = Logger.getLogger(VoteRewardAdminsPro.class.getName());
	
	static final int initialCheck = Config.VOTE_SYSTEM_START_TIME * 1000;
	static final int delayForCheck = Config.VOTE_SYSTEM_CHECK_TIME * 1000;
	int votesneed;
	
	static List<String> _ips = new ArrayList<>();
	static List<String> _accounts = new ArrayList<>();
	
	static int lastVoteCount = 0;
	
	VoteRewardAdminsPro()
	{
		if (Config.VOTE_SYSTEM_DATABASE_SAVE)
		{
			load();
		}
		
		ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new AutoReward(), initialCheck, delayForCheck);
	}
	
	public class AutoReward implements Runnable
	{
		@Override
		public void run()
		{
			int votes = getVotes();
			_log.info("VoteReward: Current Votes Top AdminsPro " + votes);
			
			if (votes >= (getLastVoteCount() + Config.VOTE_SYSTEM_COUNT))
			{
				Collection<L2PcInstance> pls = L2World.getInstance().getAllPlayers().valueCollection();
				{
					for (L2PcInstance onlinePlayer : pls)
					{
						if (onlinePlayer.isOnline() && !onlinePlayer.getClient().isDetached() && !_accounts.contains(onlinePlayer.getAccountName()) && !_ips.contains(onlinePlayer.getClient().getConnection().getInetAddress().getHostAddress()))
						{
							String[] parase = Config.VOTE_SYSTEM_ITEM_ID_ADMINSPRO.split(",");
							String[] parase3 = Config.VOTE_SYSTEM_ITEM_COUNT_ADMINSPRO.split(",");
							
							for (int o = 0; o < parase.length; o++)
							{
								int parase2 = Integer.parseInt(parase[o]);
								int parase4 = Integer.parseInt(parase3[o]);
								
								onlinePlayer.addItem("vote_reward", parase2, parase4, onlinePlayer, true);
							}
							
							_ips.add(onlinePlayer.getClient().getConnection().getInetAddress().getHostAddress());
							_accounts.add(onlinePlayer.getAccountName());
						}
					}
				}
				
				_log.info("AutoVoteRewardManager AdminsPro: All players has been rewarded for voting");
				
				Announcements.getInstance().announceToAll("be rewarded!");
				Announcements.getInstance().announceToAll("for AdminsPro vote!");
				setLastVoteCount(getLastVoteCount() + Config.VOTE_SYSTEM_COUNT);
			}
			
			if (getLastVoteCount() == 0)
			{
				setLastVoteCount(votes);
			}
			
			else if ((((getLastVoteCount() + Config.VOTE_SYSTEM_COUNT) - votes) > Config.VOTE_SYSTEM_COUNT) || (votes > (getLastVoteCount() + Config.VOTE_SYSTEM_COUNT)))
			{
				setLastVoteCount(votes);
			}
			
			votesneed = (getLastVoteCount() + Config.VOTE_SYSTEM_COUNT) - votes;
			
			if (votesneed == 0)
			{
				votesneed = Config.VOTE_SYSTEM_COUNT;
			}
			
			Announcements.getInstance().announceToAll("== VoteReward ==");
			Announcements.getInstance().announceToAll("Current votes " + votes + ".");
			Announcements.getInstance().announceToAll("Missing " + votesneed + " votes in Top AdminsPro!");
			
			_ips.clear();
			_accounts.clear();
		}
	}
	
	public int getVotes()
	{
		URL url = null;
		InputStreamReader isr = null;
		BufferedReader in = null;
		
		try
		{
			url = new URL("http://hopzone.com.es/getVotefromServer.php?ID=" + Config.VOTE_SYSTEM_PAGE_ADMINSPRO);
			URLConnection con = url.openConnection();
			con.addRequestProperty("User-Agent", "Mozilla/4.76");
			isr = new InputStreamReader(con.getInputStream());
			in = new BufferedReader(isr);
			String inputLine;
			while ((inputLine = in.readLine()) != null)
			{
				return Integer.parseInt(inputLine);
			}
			
		}
		catch (IOException e)
		{
			Announcements.getInstance().announceToAll("Top AdminsPro is offline");
			_log.warning("AutoVoteRewardHandler: " + e);
		}
		
		return 0;
	}
	
	public void setLastVoteCount(int voteCount)
	{
		lastVoteCount = voteCount;
	}
	
	int getLastVoteCount()
	{
		return lastVoteCount;
	}
	
	public void load()
	{
		int votes = 0;
		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
		{
			PreparedStatement statement = con.prepareStatement("SELECT vote FROM voteadmins LIMIT 1");// DB votebrasil
			ResultSet rset = statement.executeQuery();
			
			while (rset.next())
			{
				votes = rset.getInt("vote");
			}
			rset.close();
			statement.close();
		}
		catch (Exception e)
		{
			_log.log(Level.WARNING, "data error on vote Top AdminsPro: ", e);
		}
		
		setLastVoteCount(votes);
	}
	
	public void save()
	{
		try (Connection con = L2DatabaseFactory.getInstance().getConnection())
		{
			PreparedStatement statement = con.prepareStatement("UPDATE voteadmins SET vote = ? WHERE id=1");
			statement.setInt(1, getLastVoteCount());
			statement.execute();
			statement.close();
		}
		catch (Exception e)
		{
			_log.log(Level.WARNING, "data error on vote AdminsPro: ", e);
		}
	}
	
	public static VoteRewardAdminsPro getInstance()
	{
		return SingletonHolder._instance;
	}
	
	static class SingletonHolder
	{
		protected static final VoteRewardAdminsPro _instance = new VoteRewardAdminsPro();
	}
}
